Android 控件架构与自定义控件(一)
Android 控件架构与自定义控件(二)
Android 控件架构与自定义控件(三)
Android 控件架构与自定义控件(四)
自定义ViewGroup存在的目的就是为了对其子View进行管理,为其子View添加显示、响应的规则。因此,自定义ViewGroup通常需要重写onMeasure() 方法来对子View进行测量,重onLayout() 方法来确定子View的位置,重写onTouchEvent() 方法增加响应事件。
实现一个Android原生控件ScrollView 的自定义ViewGroup,自定义ViewGroup可以实现ScrollView所具有的上下滑动的功能,但是在滑动的过程中,增加一个粘性效果,即当一个子view向上滑动大于一定的距离后,松开手指,它将自动向上滑动,显示下一个View。同理,如果滑动距离小于一定的距离,松开手指,它将自动滑动到开始的位置
MyScrollView.java
|
|
activity_main.xml
|
|
显示效果:
事件拦截机制分析
一个技术总监- ViewGroupA,最外层的ViewGroup
一个项目经理 - ViewGroupB,中间的ViewGroup
一个干活的程序员 - View,最底层的View
ViewGroup 的分发事件有三个方法:
dispatchTouchEvent(MotionEvent ev);
onInterceptTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent event);
View的分发事件只有两个方法:
dispatchTouchEvent(MotionEvent ev);
onTouchEvent(MotionEvent event);
事件的传递顺序是:
技术总监(ViewGroupA) -> 项目经理 (ViewGroupB) -> 程序员(View)。事件传递的时候,先执行dispatchTouchEvent()方法,再执行onInterceptTouchEvent()方法。
true:拦截 false:不拦截,继续传递
事件处理的顺序是:
程序员(View)-> 项目经理 (ViewGroupB) -> 技术总监(ViewGroupA)。事件处理执行onTouchEvent()方法
true:表示自己处理
false:自己不处理,交给上级处理